import axios from 'axios'
import { ElMessage } from 'element-plus'

const baseURL = '/customer-api'

/**
 * 上传图片
 * @param {File} file - 图片文件
 * @param {String} prefix - 文件存储目录前缀（如: goods, user, banner, announcement）
 * @param {Function} onUploadProgress - 上传进度回调
 * @returns {Promise<String>} 返回文件相对路径
 */
export function uploadImage(file, prefix = 'goods', onUploadProgress) {
  const formData = new FormData()
  formData.append('file', file)

  return axios({
    url: `${baseURL}/file/uploadImage/${prefix}`,
    method: 'post',
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: onUploadProgress
  }).then(response => {
    const res = response.data
    if (res.code === 200) {
      return res.data // 返回文件路径
    } else {
      ElMessage.error(res.msg || '上传失败')
      return Promise.reject(new Error(res.msg || '上传失败'))
    }
  }).catch(error => {
    console.error('文件上传失败:', error)
    ElMessage.error('文件上传失败')
    return Promise.reject(error)
  })
}

/**
 * 获取文件完整URL
 * @param {String} fileName - 文件相对路径（如: goods/xxx.jpg）
 * @returns {String} 完整的文件URL
 */
export function getFileUrl(fileName) {
  if (!fileName) return ''
  // 如果已经是完整URL，直接返回
  if (fileName.startsWith('http://') || fileName.startsWith('https://')) {
    return fileName
  }
  return `${baseURL}/file/download?fileName=${encodeURIComponent(fileName)}`
}

/**
 * 下载文件
 * @param {String} fileName - 文件相对路径
 * @param {String} downloadName - 下载时的文件名（可选）
 */
export function downloadFile(fileName, downloadName) {
  const url = getFileUrl(fileName)
  const link = document.createElement('a')
  link.href = url
  if (downloadName) {
    link.download = downloadName
  }
  link.target = '_blank'
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}

/**
 * 批量上传图片
 * @param {Array<File>} files - 图片文件数组
 * @param {String} prefix - 文件存储目录前缀
 * @returns {Promise<Array<String>>} 返回文件路径数组
 */
export function uploadImages(files, prefix = 'goods') {
  const promises = files.map(file => uploadImage(file, prefix))
  return Promise.all(promises)
}
